<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>

</head>
<body>
</body>
</html>
<script>

// ------------------- 原型对象  ---------------------
// 原型对象：  
  // 构造函数.prototype  指向  该构造函数的 原型对象
  // 实例对象.__proto__  指向  该实例对象的 原型对象
    // but 这两个原型对象，是同一个 原型对象
  
// 总结：
  // 凡是 构造函数，都有 构造函数.prototype
  // 凡是 对象，都有 对象.__proto__
    // 这两者都指向， 原型对象


// Array.prototype.__proto__ 指的是 数组的原型对象的原型对象，指向 Object 的 原型对象





// ------------------- 原型链  ---------------------

// 总结原型链：
  // 1. 任意 对象，都有 原型对象  ->  构造函数.prototype
  // 2. 任意构造函数的 原型对象，  正常来说， 构造函数.prototype.__proto__ ，其指向 Object.protype 这个原型对象
    // 注：1） 和  2） 均是 原型对象， 其构成了  最简单的 「原型链」
  // 3. Object.prototype.__proto__  指向 null， 表示原型链 到头了
    // 注：原型链的尽头是：Object.prototype.__proto__  ，即为 null


// 原型链的作用：
  // 举例：某一个变量，如 const num = 123;
    // num.fn()  如何确定 fn 这个方法 的效果是什么？
      // 1. 先在 自己原型对象上 找有没有 这个方法，若有， 直接调用
      // 2. 若自己原型链上没有该方法，则往原型链 上 寻找
      // 3. 若一直找到 Object.prototype 仍为找到，则 该 方法不存在； 会报 not defined 的错误





// ------------  案例：  -------------

// 案例：
Object.prototype.addX = 123;
Object.prototype.addZ = 456;

const obj = {
  name: 234
}



// for (const key in obj) {
//   console.log(key); // 依次输出 name ，addX，addZ
// }

const arr = ['x', 'a', 'z']

Array.prototype.arrSelf = 'xxx';

for (const key in arr) {
  console.log(key); // 依次输出 0 、1 、2 、arrSelf 、addX 、addZ
}
</script>